Adding a working example of docker linked mysql container for issue #887

Ian Blenke 9 anni fa
parent
commit
60622c5a00
5 ha cambiato i file con 93 aggiunte e 14 eliminazioni
  1. 7 3
      docker/Dockerfile
  2. 14 3
      docker/README.md
  3. 28 0
      docker/docker-compose.yml
  4. 35 8
      docker/scripts/init
  5. 9 0
      lib/tasks/database_test.rake

+ 7 - 3
docker/Dockerfile

@@ -19,11 +19,15 @@ RUN apt-get update && \
19 19
 
20 20
 RUN pip install supervisor-stdout
21 21
 
22
-ADD scripts/ /scripts
23
-RUN chmod 755 /scripts/setup /scripts/init
24
-
22
+ADD scripts/setup /scripts/setup
23
+RUN chmod 755 /scripts/setup
25 24
 RUN /scripts/setup
26 25
 
26
+WORKDIR /app
27
+
28
+ADD scripts/init /scripts/init
29
+RUN chmod 755 /scripts/init
30
+
27 31
 VOLUME /var/lib/mysql
28 32
 
29 33
 EXPOSE 5000

+ 14 - 3
docker/README.md

@@ -51,13 +51,15 @@ Simple stand-alone usage:
51 51
 
52 52
 To link to another mysql container, for example:
53 53
 
54
-    docker run --rm --name newcentury_mysql -p 3306 \
54
+    docker run --rm --name mysql \
55 55
         -e HUGINN_MYSQL_DATABASE=huginn \
56 56
         -e HUGINN_MYSQL_USER=huginn \
57 57
         -e HUGINN_MYSQL_PASSWORD=somethingsecret \
58 58
         -e HUGINN_MYSQL_ROOT_PASSWORD=somethingevenmoresecret \
59 59
         cantino/huginn
60
-    docker run --rm --name huginn --link newcentury_mysql:MYSQL -p 5000:5000 \
60
+    docker run --rm --name huginn \
61
+        --link mysql \
62
+        -p 5000:5000 \
61 63
         -e HUGINN_DATABASE_NAME=huginn \
62 64
         -e HUGINN_DATABASE_USER=huginn \
63 65
         -e HUGINN_DATABASE_PASSWORD=somethingsecret \
@@ -65,7 +67,16 @@ To link to another mysql container, for example:
65 67
 
66 68
 To link to another container named 'postgres':
67 69
 
68
-    docker run --rm --name huginn --link POSTGRES:mysql -p 5000:5000 -e "DATABASE_USER=huginn" -e "DATABASE_PASSWORD=pass@word" cantino/huginn
70
+    docker run --rm --name huginn \
71
+        --link postgres:postgresql \
72
+        -p 5000:5000 \
73
+        -e "HUGINN_DATABASE_USER=huginn" \
74
+        -e "HUGINN_DATABASE_PASSWORD=pass@word" \
75
+        cantino/huginn
76
+
77
+The `docker/` folder also has a `docker-compose.yml` that allows for a sample database formation with a data volume container:
78
+
79
+    cd docker ; docker-compose up
69 80
 
70 81
 ## Environment Variables
71 82
 

+ 28 - 0
docker/docker-compose.yml

@@ -0,0 +1,28 @@
1
+mysqldata:
2
+  image: mysql
3
+  command: true
4
+
5
+mysql:
6
+  image: mysql
7
+  volumes_from:
8
+    - mysqldata
9
+  environment:
10
+    MYSQL_ROOT_PASSWORD: myrootpassword
11
+    MYSQL_DATABASE: huginn
12
+    MYSQL_USER: huginn
13
+    MYSQL_PASSWORD: myhuginnpassword
14
+
15
+huginn:
16
+  build: .
17
+  ports:
18
+    - 5000:5000
19
+  environment:
20
+    HUGINN_DATABASE_NAME: huginn
21
+    HUGINN_DATABASE_USERNAME: root
22
+    HUGINN_DATABASE_PASSWORD: myrootpassword
23
+    INTENTIONALLY_SLEEP: 10
24
+    #DATABASE_INITIAL_CONNECT_MAX_RETRIES: 5
25
+    PORT: 5000
26
+  links:
27
+    - mysql
28
+

+ 35 - 8
docker/scripts/init

@@ -100,7 +100,7 @@ EOF
100 100
 
101 101
   # wait for mysql server to start (max 120 seconds)
102 102
   timeout=120
103
-  while ! mysqladmin -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1
103
+  while ! mysqladmin -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1
104 104
   do
105 105
     (( timeout = timeout - 1 ))
106 106
     if [ \$timeout -eq 0 ]; then
@@ -111,10 +111,10 @@ EOF
111 111
     sleep 1
112 112
   done
113 113
 
114
-  if ! echo "USE \${DATABASE_NAME}" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then
114
+  if ! echo "USE \${DATABASE_NAME}" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then
115 115
     DB_INIT="yes"
116 116
     echo "CREATE DATABASE IF NOT EXISTS \\\`\${DATABASE_NAME}\\\` DEFAULT CHARACTER SET \\\`utf8\\\` COLLATE \\\`utf8_unicode_ci\\\`;" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
117
-    echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
117
+    echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
118 118
   fi
119 119
 fi
120 120
 supervisorctl start foreman >/dev/null
@@ -142,19 +142,46 @@ cat <<FOREMAN > /tmp/foreman.sh
142 142
 #!/bin/bash -e
143 143
 source /app/.env
144 144
 
145
+# The database may need to start up for a bit first
146
+if [ -n "\${INTENTIONALLY_SLEEP}" ]; then
147
+  echo "Intentionally sleeping \${INTENTIONALLY_SLEEP}"
148
+  sleep \${INTENTIONALLY_SLEEP}
149
+fi
150
+
151
+if [ -n "\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}" ]; then
152
+  max=\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}
153
+  count=0
154
+  while ! rake mysql_test:ping > /dev/null 2>&1 && [[ \$count -le \$max ]] ; do
155
+    count=\$[\$count+1]
156
+    echo "Retry \$count of \$max attempting to connect to \$DATABASE_HOST. Sleeping \${DATABASE_INITIAL_CONNECT_SLEEP:5}"
157
+    sleep \${DATABASE_INITIAL_CONNECT_SLEEP:5}
158
+  done
159
+fi
160
+
161
+# We may need to try and create a database
162
+if [ -n "\${CREATE_DB}" ]; then
163
+ sudo -u huginn -EH bundle exec rake db:create
164
+fi
165
+
145 166
 # Assuming we have a created database, run the migrations and seed it idempotently.
146
-[ -z "\${DO_NOT_MIGRATE}" ] && sudo -u huginn -EH bundle exec rake db:migrate
147
-[ -z "\${DO_NOT_SEED}" ] && sudo -u huginn -EH bundle exec rake db:seed
167
+if [ -z "\${DO_NOT_MIGRATE}" ]; then
168
+ sudo -u huginn -EH bundle exec rake db:migrate
169
+fi
148 170
 
149
-[ -n "\$INTENTIONALLY_SLEEP" ] && sleep \$INTENTIONALLY_SLEEP
171
+if [ -z "\${DO_NOT_SEED}" ]; then
172
+  sudo -u huginn -EH bash -xc 'bundle exec rake db:seed &'
173
+fi
150 174
 
151 175
 # Fixup the Procfile and prepare the PORT
152
-[ -n "\${DO_NOT_RUN_JOBS}" ] && perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile
176
+if [ -n "\${DO_NOT_RUN_JOBS}" ]; then
177
+  perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile
178
+fi
179
+
153 180
 perl -pi -e 's/rails server\$/rails server -b 0.0.0.0 -p \\\$PORT/' /app/Procfile
154 181
 export PORT
155 182
 
156 183
 # Start huginn
157
-exec sudo -u huginn -EH bundle exec foreman start
184
+exec sudo -u huginn -EH bash -xc 'exec bundle exec foreman start'
158 185
 FOREMAN
159 186
 
160 187
 chmod 755 /tmp/foreman.sh

+ 9 - 0
lib/tasks/database_test.rake

@@ -0,0 +1,9 @@
1
+namespace :database_test do
2
+  desc "Ping the database"
3
+  task :ping do
4
+    require 'active_record'
5
+    require 'mysql2'
6
+    ActiveRecord::Base.establish_connection
7
+    ActiveRecord::Base.connection.verify!
8
+  end
9
+end